title: git文档 2-基础
date: 2020.5.17
top:
tags:


2020.5.17 星期日 20:56

2. Git 基础

2.1 获取 Git 仓库

git init
git clone [<options>] [--] <repo> [<dir>]
https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议,比如 user@server:path/to/repo.git 。

2.2 记录每次更新到仓库

请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪 或 未跟踪。
#### add
暂存这次更新,需要运行 git add 命令。
这是个多功能命令:1) 可以用它开始跟踪新文件,2)或者把已跟踪的文件放到暂存区,3)还能用于合并时把有冲突的文件标记为已解决状态等。
将这个命令理解为 “精确地将内容添加到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。
#### status
#### diff
但 git diff 能通过文件补丁的格式更加具体地显示哪些行发生了改变。(相比于git status)
diff 此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。
若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff –staged 命令。 这条命令将比对已暂存文件与最后一次提交的文件差异
用 git diff –cached 查看已经暂存起来的变化( –staged 和 –cached 是同义词):
#### rm
#### mv
移动文件/重命名

git status -s  
git diff -cached # git diff --staged
git rm # 该文件就不再纳入版本管理了。相对于 git add  添加到暂存区
    ## 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f 
git rm --cached # 从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中(磁盘) 

2.3 查看提交历史

你也可以限制显示的日志条目数量,例如使用 -2 选项来只显示最近的两次提交
-p 或 –patch ,它会显示每次提交所引入的差异(按 补丁 的格式输出)。
附带一系列的总结性选项。 比如你想看到每次提交的简略统计信息,可以使用 –stat 选项:
pretty。 这个选项可以使用不同于默认格式的方式展示提交历史。
当 oneline 或 format 与另一个 log 选项 –graph 结合使用时尤其有用。

常用选项:p,stat,shortstat,name-only,name-status,abbrev-commit,relative-date,graph,pretty,oneline(–pretty=oneline –abbrev-commit 合用的简写。)
限制输出:n,since/after,until/before,author,committer,grep,S,no-merges , – path

git log -p -2 #  
git log --stat      
git log --pretty=oneline     # oneline , short,full 和 fuller 选项。format 定制记录的显示格式。    
git log --pretty=format:"%h - %an, %ar : %s"    

2.4 撤消操作

git commit –amend 。从效果上来说,就像是旧有的提交从未存在过一样,它并不会出现在仓库的历史中。

取消暂存的文件: git reset HEAD <file> (通过add添加的文件)
撤消对文件的修改 git checkout -- <file>
以上两个都是危险的操作。

记住,在 Git 中任何 已提交 的东西几乎总是可以恢复的。
甚至那些被删除的分支中的提交或使用 –amend 选项覆盖的提交也可以恢复

2.5 远程仓库的使用

git remote
指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。

git remote -v 
git remote show <remote>    
git remote add <shortname> <url>    
    git fetch <remote>  # 如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。   
        # git pull ## 
    git push origin master
git remote rename pb paul    # 这同样也会修改你所有远程跟踪的分支名字。 那些过去引用 pb/master 的现在会引用 paul/master。
git remote remove paul  # git remote rm  
    ## 所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。 

2.6 打标签

然而,如果你提供了一个匹配标签名的通配模式,那么 -l 或 –list 就是强制使用的。

Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。
轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。
本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。 创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字:
而附注标签是存储在 Git 数据库中的一个完整对象,

git tag 
git tag -l "v1.8.5*"    
git tag -a v1.4 -m "my version 1.4"  # 附注标签 
    ## git show v1.4 # 标签信息和与之对应的提交信息    
git tag v1.4-lw  # 轻量标签 不需要使用 -a、-s 或 -m 
    ## git show,你不会看到额外的标签信息。 命令只会显示出提交信息 
# 后期打标签
git tag -a v1.2 9fceb02  # 后期打标签
# 共享标签
git push origin <tagname>  # 
git push origin --tags # 一次性推送很多标签.(不会区分轻量标签和附注标签, 没有简单的选项能够让你只选择推送一种标签。)
# 删除
git tag -d v1.4-lw # 删除掉你本地仓库上的标签
git push <remote> :refs/tags/<tagname>  # 更新你的远程仓库. 
    ## 将冒号前面的空值推送到远程标签名,从而高效地删除它。
git push origin --delete <tagname> # 第二种方式删除远程标签  

# 检出标签
git checkout 2.0.0      
git checkout -b version2 v2.0.0     

#### 检出标签
会使你的仓库处于“分离头指针(detacthed HEAD)”的状态——这个状态有些不好的副作用:
在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支:

2.7 Git 别名

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

$ git config --global alias.unstage 'reset HEAD --'
$ git config --global alias.last 'log -1 HEAD'  

$ git config --global alias.visual '!gitk' # 可能想要执行外部命令,而不是一个 Git 子命令 

2.8 总结

3. Git 分支

3.1 分支简介

Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照 。
Git 仓库中有五个对象:
三个 blob 对象(保存着文件快照)、
一个 树 对象 (记录着目录结构和 blob 对象索引)
一个 提交 对象(包含着指向前述树对象的指针和所有提交信息)。

3.2 分支的新建与合并

3.3 分支管理

3.4 分支开发工作流

3.5 远程分支

3.6 变基

3.7 总结